/*
 * Copyright 2017 Baiyyy
 * @(#)CCTSServerDecoder.java
 */

package com.byyy.ccts.modules.cc.server.codec;

import com.byyy.ccts.modules.cc.Global;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * Created by DELL on 2018-5-7.
 */
public class CCTSServerDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 可读长度必须大于基本长度
        if (byteBuf.readableBytes() >= Global.MIN_LEN) {
            // 防止socket字节流攻击，因为客户端不会传递太大的数据
            if (byteBuf.readableBytes() > 2048) {
                byteBuf.skipBytes(byteBuf.readableBytes());
            }

            // 记录数据流开始的index，防止本次读取不到包尾时重置数据流
            int beginReader;
            int packEndIndex = 0;

            // 获取数据流开始的index
            beginReader = byteBuf.readerIndex();
            // 标记数据流开始的index
            byteBuf.markReaderIndex();
            // 略过包头即0x7e
            byte b = byteBuf.readByte();
            while (true) {
                // 读取协议的结束标志
                b = byteBuf.readByte();
                if ( b == Global.PACK_END) {
                    packEndIndex = byteBuf.readerIndex() - beginReader;
                    break;
                }

                // 未读取到协议的结束标志就返回，等待数据流到达
                if (byteBuf.readableBytes() <= 0) {
                    break;
                }
            }

            // 重置标志位，重新读取数据
            byteBuf.readerIndex(beginReader);
            // 没有读到结束标志，还原
            if (packEndIndex == 0) {
                return;
            }

            // 读取data数据
            byte[] data = new byte[packEndIndex];
            byteBuf.readBytes(data);

            CCTSServerProtocol protocol = new CCTSServerProtocol();
            protocol.setContent(data);
            list.add(protocol);
        }
    }

}
